「はじめてのモダンデータ解析基盤」でデータレイクを学ぶ
こんにちは、崔です。
7/21(火)に開催されたAWSJのオンラインセミナー「はじめてのモダンデータ解析基盤」に参加しましたので、そのハンズオンを振返りたいと思います。
ハンズオン概要
ハンズオンの概要は次のとおりです。
本セミナーでは、AWS のデータ解析基盤サービス群の説明を中心に、進化するデータ解析基盤のコンセプトであるモダンデータ解析基盤についてご紹介します。 またセミナー後半では、実際の AWS データ解析サービス群である、Amazon Athena,AWS Glue, Amazon Redshift Spectrum, Amazon S3 Select について体験いただくハンズオンを実施します。 前半のセッション部分のみの参加も、セッションおよびハンズオン両方の参加も可能です。
アジェンダ
- 【前半】AWSのデータ解析基盤サービス群のご紹介
- 【後半】Amazon Athena, AWS Glue, Amazon Redshift Spectrum, Amazon S3 Select のハンズオン
本ブログでは、セミナー後半のハンズオンを振返ります。
ハンズオンについては、ドキュメントが提供され、その手順に沿って実施していく形でした。
気になる方は、8/18(火)にも開催予定のようですので、興味を持たれた方はぜひ参加してみて下さい。
昼間の時間帯に参加が難しい方は、8/4(火)の夜にJAWS-UGとしても開催されるようですので、こちらもぜひ。
はじめに
ハンズオンの資料から今回のゴールを引用します。
幅広いデータソースからの構造化データ、または非構造化データの集中リポジトリとして使用できる Data Lake は、データの保存と分析の方法として多くの企業に取り入れられています。 AWS のビッグデータ関連サービスを使用して実際に分析パイプラインを構築することを通して、Data Lake とビッグデータ分析基盤構築の実感を持って頂くことをゴールとしています。
主に4つのセクションからハンズオンが構成されていました。
- 準備
- アプリケーションログの永続化と長期間データの分析と可視化
- クラウドDWHを使用したデータ分析
- サーバーレスでデータのETL処理
これらのセクションを通じて、長期間のデータをバッチ分析する環境の構築について、体験することができます。
今回は、ログデータをS3に安価に長期保存しながら、アドホックにログデータを直接クエリしたり、DWHで細かく分析をおこなったり、ETL処理を行ったり、と一通り実行できます。
1.準備
これから実施する3つのセクションについて、ベースとなる環境を構築します。
CloudFormation のテンプレートが用意されていて、実行するだけでした。
EC2 上のサンプルアプリケーションからログが出力されていて、Kinesis Data Firehose に送信後、S3に長期保存されるようになっています。
(ハンズオン資料から抜粋)
2.アプリケーションの永続化と長期間データの分析と可視化
このセクションでは、Kinesis Data Firehose 経由で S3 に保存されたデータを、Amazon Athena を用いて、アドホックな分析を行います。また、S3 Selectでも確認します。
EC2のロールに権限を追加する
まず、上記で作成されたロールに次のポリシーを追加します。
- AWSGlueServiceRole
- AmazonS3ReadOnlyAccess
また、「信頼関係の編集」にて、Serviceの箇所にGlueを追加します。
Glue でクローラーの実行
AWS Glueでクローラを追加します。
データストアの追加で、準備で作成したS3バケットを指定します。
IAMロールの選択で、先程ポリシーを追加したロールを選択します。
データベースを追加し、クローラを作成します。
作成したクローラを実行します。
テーブルやスキーマ定義が作成されます。
Athenaでクエリ実行
次にAthenaの設定から、「クエリの結果の場所」を設定します。
次に、コンソールの左側から、データベース「minilake」とテーブル「minilake_in1」を選択し、「テーブルのプレビュー」を選択すると、データを確認することができます。
また、様々なSQLを実行することで、データの中身を確認することが可能です。
S3 Selectでクエリ実行
次に、作成したS3バケットを選択し、ログが出力されている階層まで移動します。
対象のログを選択し,メニュー「アクション」から「S3 Select」を選択します。
ファイル形式「JSON」を選び、SQL式にSQLを入力します。
これで、S3 Selectでデータを確認できました。
これで、EC2からKinesis Data Firehose 経由で S3 に保存されたデータに対して、Glueを用いてテーブルを作成し、Athenaでデータを確認したり、直接 S3 Selectでデータを確認することができました。
3.クラウドDWHを使用したデータ分析
このセクションでは、同じS3のデータを、Redshift や Redshift Spectrumで確認します。
Redshiftの構築
まず、Redshiftの設定から「サブネットグループ」を作成します。
次に、クラスターを作成します。
5~10分ほどでクラスターが構築されます。
RedshiftにIAMロールを付与
次に、RedshiftからS3にアクセスして、データをロードする準備をします。
まず、新規にIAMロールを作成します。
「信頼されたエンティティの種類を選択」で、「AWSサービス」を選択し、「Redshift」、「Redshift - Customizable」を選択します。
「Attach アクセス権限ポリシー」で「S3ReadOnlyAccess」を選択し、IAMロールを作成します。
次に、作成したIAMロールをRedshiftクラスターにアタッチします。
まず、作成したRedshiftクラスターを選択し、アクションの「IAMロールの管理」から、先程作成したIAMロールを選択します。
Redshiftにデータをロード
Redshiftに接続後、エディタからSQLを実行し、ロード対象のテーブルを作成します。
create table ec2log ( timestamp varchar, alarmlevel varchar, host varchar, number int2, text varchar );
続いて、S3からデータをコピーします。
copy ec2log from 's3://20200726-handson-minilake/minilake-in1' format as json 'auto' iam_role 'arn:aws:iam::123456789012:role/handson-minilake-dwh';
これで、テーブルに対して、クエリが実行できます。
select count(timestamp) from ec2log;
Redshift Spectrumの利用
まず、Redshift Spectrumのスキーマとデータベースを作成できるように、IAMロールにポリシーを追加します。
Redshiftに付与したIAMロールを選択し、ポリシー「AWSGlueServiceRole」をアタッチします。
Redshiftに戻り、SQLを実行し、外部スキーマを作成します。
create external schema my_first_external_schema from data catalog database 'spectrumdb' iam_role 'arn:aws:iam::123456789012:role/handson-minilake-dwh' create external database if not exists;
次に、外部テーブルを作成します。
create external table my_first_external_schema.ec2log_external ( timestamp varchar(max), alarmlevel varchar(max), host varchar(max), number int2, text varchar(max) ) partitioned by ( year char(4), month char(2), day char(2), hour char(2)) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ( 'paths'='timestamp,alarmlevel,host,number,text') STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' location 's3://20200726-handson-minilake/minilake-in1';
次に外部テーブルにパーティションを追加します。
ALTER TABLE my_first_external_schema.ec2log_external ADD PARTITION (year='2020', month='07', day='26', hour='05') LOCATION 's3://20200726-handson-minilake/minilake-in1/2020/07/26/05';
これで、データが投入されましたので、クエリを実行してデータを確認できます。
select count(*) from my_first_external_schema.ec2log_external;
これで、S3のデータをRedshiftにロードしたり、S3上のデータをRedshift Spectrumに取り込むことで、DWHでのデータ読み込みができました。
4.サーバーレスでデータのETL処理
このセクションでは、Glueを使用してParquet形式にデータのETL処理を行い、Athenaで確認します。
IAMロールにポリシーを追加
IAMロールに「AmazonS3FullAccess」ポリシーを追加します。
GlueでETLジョブの作成
最初に作成したS3バケットを選択し、ETL処理の出力先のフォルダを作成します。
次に、Glueでジョブを追加します。
名前、IAMロールを設定し、モニタリングオプションで「ジョブメトリクス」にチェックを入れます。
次に、セキュリティ設定、スクリプトライブラリおよびジョブパラメータにて、最大容量を2に設定します。
データソースとなるS3フォルダを選択し、データターゲットを選択します。
Parquet形式に変換します。
続いての画面で、ジョブの実行を行います。
ジョブが正常に終了すると、出力先のS3フォルダにParquet形式でデータが出力されます。
Glueでクローラーの実行
Glueでクローラーを追加します。
データストアの追加で、先程の出力先フォルダを選択します。
作成したクローラーを実行します。
テーブル minilake-out1 がParquet形式で作成されました。
Athenaで実行
Athenaで元のテーブルとParquet形式のテーブルに対してSQLを実行します。
SELECT count(user) FROM "minilake"."minilake_in1" WHERE user='uchida' AND timestamp >= '2020-07-26 09%' AND timestamp <= '2020-07-26 21%'
SELECT count(user) FROM "minilake"."minilake_out1" WHERE user='uchida' AND timestamp >= '2020-07-26 09%' AND timestamp <= '2020-07-26 21%'
そうすると、スキャンしたデータ量が、Parquet形式のテーブルの方が、不要なカラムを読み込まない分、圧倒的に少ないことが確認できます。
Glueジョブでパーティション作成
次に、パーティション形式で試してみます。
最初に作成したS3バケットを選択し、フォルダ minilake-out2 を作成します。
先程のGlueのジョブを選択し、「スクリプトの編集」を実行します。
write_dynamic_frame の partitionKeys オプションを使い、パーティション分割して出力指定します。
ジョブの編集が完了したら、ジョブを実行します。
Glueでクローラーの実行
先程と同様に、Glueでクローラーを追加します。
今回は、データストアの追加で、先程の出力先フォルダ minilake-out2を選択します。
作成したクローラーを実行します。
テーブル minilake-out2 がParquet形式、パーティション状態で作成されました。
Athenaで実行
Athenaで元のテーブルとParquet形式のテーブルに対してSQLを実行します。
SELECT count(user) FROM "minilake"."minilake_out2" WHERE user='uchida' AND timestamp >= '2020-07-26 09%' AND timestamp <= '2020-07-26 21%'
先程よりも、スキャン量の減少が確認できます。
これで、GlueでParquet形式に変換したテーブルをパーティション化し、Athenaで確認することができました。
まとめ
本ハンズオンでは、EC2からKinesis Data Firehose経由でS3上に保存されたデータに対して、AthenaやS3 Selectでの検索を試したり、S3上のデータをRedshiftに格納したり、Redshift Spectrumとして検索したり、また、Glueを利用してParquet形式にETL処理を実行したり、と一通りの機能を気軽に試すことができました。
データ分析のとっかかりとしては、非常に幅広く試すことができるハンズオンだったと思います。
気になった方は、ぜひ次回のハンズオンに参加してみて下さい。